using System;
using Server;
using Server.Network;
using System.Collections;

namespace Server.Gumps
{
	public class ImageTileButtonInfo
	{
		private int m_ItemID;
		private int m_Hue;
		private int m_LocalizedTooltip;

		private TextDefinition m_Label;

		public virtual int ItemID
		{
			get{ return m_ItemID; }
			set{ m_ItemID = value; }
		}
		public virtual int Hue
		{
			get{ return m_Hue; }
			set{ m_Hue = value; }
		}
		public virtual int LocalizedTooltip
		{
			get{ return m_LocalizedTooltip; }
			set{ m_LocalizedTooltip = value; }
		}

		public virtual TextDefinition Label
		{
			get{ return m_Label; }
			set{ m_Label = value; }
		}

		public ImageTileButtonInfo( int itemID, int hue, TextDefinition label, int localizedTooltip )
		{
			m_Hue = hue;
			m_ItemID = itemID;
			m_Label = label;
			m_LocalizedTooltip = localizedTooltip;
		}
		public ImageTileButtonInfo( int itemID, int hue, TextDefinition label ) : this( itemID, hue, label, -1 )
		{
		}
	}

	public class BaseImageTileButtonsGump : Gump
	{
		private ImageTileButtonInfo[] m_Buttons;

		protected ImageTileButtonInfo[] Buttons { get { return m_Buttons; } }

		protected virtual int XItems{ get{ return 2; } }
		protected virtual int YItems{ get { return 5; } }

		public BaseImageTileButtonsGump( TextDefinition header, ArrayList buttons ) : this( header, (ImageTileButtonInfo[])buttons.ToArray( typeof( ImageTileButtonInfo ) ) )
		{
		}
		public BaseImageTileButtonsGump( TextDefinition header, ImageTileButtonInfo[] buttons ) : base( 10, 10 )	//Coords are 0, o on OSI, intentional difference
		{
			m_Buttons = buttons;
			AddPage( 0 );

			int x = XItems * 250;
			int y = YItems * 64;

			AddBackground( 0, 0, x+20, y+84, 0x13BE );
			AddImageTiled( 10, 10, x, 20, 0xA40 );
			AddImageTiled( 10, 40, x, y+4, 0xA40 );
			AddImageTiled( 10, y+54, x, 20, 0xA40 );
			AddAlphaRegion( 10, 10, x, y+64 );

			AddButton( 10, y+54, 0xFB1, 0xFB2, 0, GumpButtonType.Reply, 0 ); //Cancel Button
			AddHtmlLocalized( 45, y+56, x-50, 20, 1060051, 0x7FFF, false, false ); // CANCEL
			TextDefinition.AddHtmlText( this, 14, 12, x, 20, header, false, false, 0x7FFF, 0xFFFFFF );

			AddPage( 1 );

			int itemsPerPage = XItems * YItems;

			for( int i = 0; i < buttons.Length; i++ )
			{
				int position = i % itemsPerPage;

				int innerX = (position % XItems) * 250 + 14;
				int innerY = (position / XItems) * 64 + 44;

				int pageNum = i / itemsPerPage + 1;

				if( position == 0 && i != 0 )
				{
					AddButton( x-100, y+54, 0xFA5, 0xFA7, 0, GumpButtonType.Page, pageNum );
					AddHtmlLocalized( x-60, y+56, 60, 20, 1043353, 0x7FFF, false, false ); // Next

					AddPage( pageNum );

					AddButton( x-200, y+54, 0xFAE, 0xFB0, 0, GumpButtonType.Page, pageNum - 1 );
					AddHtmlLocalized( x-160, y+56, 60, 20, 1011393, 0x7FFF, false, false ); // Back

				}

				ImageTileButtonInfo b = buttons[i];

				AddImageTiledButton( innerX, innerY, 0x918, 0x919, 100 + i, GumpButtonType.Reply, 0, b.ItemID, b.Hue, 15, 10, b.LocalizedTooltip );
				TextDefinition.AddHtmlText( this, innerX + 84, innerY, 250, 60, b.Label, false, false, 0x7FFF, 0xFFFFFF );
			}
		}

		public override void OnResponse( NetState sender, RelayInfo info )
		{
			int adjustedID = info.ButtonID - 100;

			if( adjustedID >= 0 && adjustedID < Buttons.Length )
				HandleButtonResponse( sender, adjustedID, Buttons[adjustedID] );
			else
				HandleCancel( sender );

		}

		public virtual void HandleButtonResponse( NetState sender, int adjustedButton, ImageTileButtonInfo buttonInfo )
		{
		}

		public virtual void HandleCancel( NetState sender )
		{
		}
	}
}